package com.zygk.library.util;

import java.lang.Character.UnicodeBlock;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringUtils {

  /**
   * 字符串解析成键值对
   */
  public static Map<String, String> parseMapFromString(String baseString) {
    String[] arr = baseString.split(",");
    Map<String, String> result = new HashMap<String, String>();
    for (int i = 0; i < arr.length; i++) {
      String tempString[] = arr[i].split("=");
      String key = tempString[0].trim();
      String value = tempString[1].trim().substring(1, tempString[1].length() - 1);
      result.put(key, value);
    }

    return result;
  }

  public static String gbk2utf8(String gbk) {
    String l_temp = GBK2Unicode(gbk);
    l_temp = unicodeToUtf8(l_temp);

    return l_temp;
  }

  public static String utf82gbk(String utf) {
    String l_temp = utf8ToUnicode(utf);
    l_temp = Unicode2GBK(l_temp);

    return l_temp;
  }

  public static String GBK2Unicode(String str) {
    StringBuffer result = new StringBuffer();
    for (int i = 0; i < str.length(); i++) {
      char chr1 = (char) str.charAt(i);

      if (!isNeedConvert(chr1)) {
        result.append(chr1);
        continue;
      }

      result.append("\\u" + Integer.toHexString((int) chr1));
    }

    return result.toString();
  }

  /**
   * @return String
   */

  public static String Unicode2GBK(String dataStr) {
    int index = 0;
    StringBuffer buffer = new StringBuffer();

    int li_len = dataStr.length();
    while (index < li_len) {
      if (index >= li_len - 1 || !"\\u".equals(dataStr.substring(index, index + 2))) {
        buffer.append(dataStr.charAt(index));

        index++;
        continue;
      }

      String charStr = "";
      charStr = dataStr.substring(index + 2, index + 6);

      char letter = (char) Integer.parseInt(charStr, 16);

      buffer.append(letter);
      index += 6;
    }

    return buffer.toString();
  }

  public static boolean isNeedConvert(char para) {
    return (((para & (0x00FF)) != para) && !isChinese(para));
  }

  private static final boolean isChinese(char c) {
    UnicodeBlock ub = UnicodeBlock.of(c);
    if (ub == UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
        || ub == UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
        || ub == UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
        || ub == UnicodeBlock.GENERAL_PUNCTUATION
        || ub == UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
        || ub == UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
      return true;
    }
    return false;
  }

  /**
   * utf-8 Unicode
   *
   * @return String
   */
  public static String utf8ToUnicode(String inStr) {
    char[] myBuffer = inStr.toCharArray();

    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < inStr.length(); i++) {
      UnicodeBlock ub = UnicodeBlock.of(myBuffer[i]);
      if (ub == UnicodeBlock.BASIC_LATIN) {
        sb.append(myBuffer[i]);
      } else if (ub == UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
        int j = (int) myBuffer[i] - 65248;
        sb.append((char) j);
      } else {
        short s = (short) myBuffer[i];
        String hexS = Integer.toHexString(s);
        String unicode = "\\u" + hexS;
        sb.append(unicode.toLowerCase());
      }
    }
    return sb.toString();
  }

  /**
   * @return String
   */
  public static String unicodeToUtf8(String theString) {
    char aChar;
    int len = theString.length();
    StringBuffer outBuffer = new StringBuffer(len);
    for (int x = 0; x < len; ) {
      aChar = theString.charAt(x++);
      if (aChar == '\\') {
        aChar = theString.charAt(x++);
        if (aChar == 'u') {
          // Read the xxxx
          int value = 0;
          for (int i = 0; i < 4; i++) {
            aChar = theString.charAt(x++);
            switch (aChar) {
              case '0':
              case '1':
              case '2':
              case '3':
              case '4':
              case '5':
              case '6':
              case '7':
              case '8':
              case '9':
                value = (value << 4) + aChar - '0';
                break;
              case 'a':
              case 'b':
              case 'c':
              case 'd':
              case 'e':
              case 'f':
                value = (value << 4) + 10 + aChar - 'a';
                break;
              case 'A':
              case 'B':
              case 'C':
              case 'D':
              case 'E':
              case 'F':
                value = (value << 4) + 10 + aChar - 'A';
                break;
              default:
                throw new IllegalArgumentException("Malformed   \\uxxxx   encoding.");
            }
          }
          outBuffer.append((char) value);
        } else {
          if (aChar == 't') {
            aChar = '\t';
          } else if (aChar == 'r') {
            aChar = '\r';
          } else if (aChar == 'n') {
            aChar = '\n';
          } else if (aChar == 'f') aChar = '\f';
          outBuffer.append(aChar);
        }
      } else {
        outBuffer.append(aChar);
      }
    }
    return outBuffer.toString();
  }

  public static boolean isBlank(String str) {
    return (str == null || str.trim().length() == 0);
  }

  /**
   * 在字符串指定位置插入字符串
   *
   * @param str 原字符串
   * @param separator 要插入的字符串
   * @param offset 插入位置
   * @return 修改后的字符串
   */
  public static String insertSeparator(String str, String separator, int offset) {
    if (StringUtils.isBlank(str) || str.length() < offset) {
      return "";
    }
    if (str.contains(separator)) return str;
    StringBuilder sb = new StringBuilder(str);
    sb.insert(offset, separator);

    return sb.toString();
  }

}
